package com.security.authority.impl;

import com.security.authority.MyAuthorityPermit;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

/**
 * @USER: ysx
 * @CREATE: 2021/2/4 20:10
 *
 * 本类型的对象，必须被Spring容器管理。否则在Security配置类型中，无法获取对象
 * 常使用路径地址作为映射规则。直接匹配资源信息。不匹配角色信息
 * 数据库中保存的权限数据是：/login  /logout  /toMain    /failure    /success等
 *
 */
@Component
public class MyAuthorityPermitImpl implements MyAuthorityPermit {

    /**
     * 定义，请求参数中包含权限相关信息
     * 参数名：roles;参数值:字符串数组。代表本次请求地址，需要的访问权限
     * 参数名：authorities；参数值：字符串数组。代表本次请求地址，需要的访问权限
     *
     * @param request   请求对象，可以通过请求对象获取请求路径，请求参数，请求作用于数据
     * @param authentication    用户登录后，Spring Security维护的用户登录标记。内部包含登录用户的名称和权限集合
     * @return
     */
    @Override
    public boolean hasAuthority(HttpServletRequest request, Authentication authentication) {

        //获取请求参数
        String[] roles = request.getParameterValues("roles");
        String[] authorities = request.getParameterValues("authorities");

        //获取当前登录用户拥有的权限集合列表
        System.out.println("权限集合：" + authentication.getAuthorities());
        System.out.println("身份：" + authentication.getPrincipal());
        System.out.println("凭证：" + authentication.getCredentials());
        System.out.println("明细" + authentication.getDetails());
        System.out.println("是否登录：" + authentication.isAuthenticated());

        for (String role : roles) { //判断角色权限
            String tmp = "ROLE_" + role; //拼接前缀
            //判断用户权限集合中，是否包含当前请求路径需要的权限
            if (authentication.getAuthorities().contains(new SimpleGrantedAuthority(tmp))){
                //登录用户有权限，可以访问
                return true;
            }
        }

        for (String authority : authorities) {  //判断资源权限
            if (authentication.getAuthorities().contains(new SimpleGrantedAuthority(authority))) {
                //登录用户有权限
                return true;
            }
        }

        //登录用户无权限，不可以访问
        return false;

    }
}
